Risposte a domande

2 Librerie per il pre-processing

SpaCy: SpaCy è una libreria Python che permette il pre-processing mediante l’uso di modelli pre-addestrati. Per più di 70 lingue sono disponibili small e large model. Un large model è ovviamente più pesante ma poichè è stato addestrato su un corpus di documenti più grande performa meglio di uno small.

SpaCy prima di tutto tokenizza il testo per produrre un oggetto Doc. Il documento viene poi elaborato in una pipeline che include tipicamente un tagger, un lemmatizzatore, un parser e un entity recognizer. Ogni componente della pipeline restituisce il documento elaborato, che viene poi passato al componente successivo.

Dopo aver scaricato un modello è dunque possibile effettuare una tokenizzazione del testo. In particolar modo si possono creare i token singoli oppure tokenizzare la frase. Per i singoli token SpaCy mette a disposizione varie informazioni come: shape (per capire quali caratteri sono in lowercase e quali in uppercase), lemma, punct (true se il token è punteggiatura), space (true se è uno spazio), entity (avverbio, articolo, nome, etc…). Per ogni modello sono disponibili le relative stop word, ma è possibile anche aggiungere le proprie. SpaCy inoltre offre anche dei modelli di embeddings Word2Vec per rappresentare le parole.

NLTK: NLTK è una libreria Python che permette il pre-processing dei documenti. A differenza di SpaCy che offre dei modelli pre-addestrati, NLTK è orientata alla manipolazione diretta delle stringhe e supporta principalmente la lingua inglese. Anche con NLTK è possibile tokenizzare separando le frasi o creando dei singoli token. Si possono scaricare una lista di caratteri tipici su cui tokenizzare (segni di punteggiatura, spazi bianchi, etc…) e anche una lista di stopword. A entrambe si possono aggiungere i propri dati. Poichè la libreria è orientata alla manipolazione di stringhe bisogna definire più accuratamente una strategia di tokenizzazione, rispetto a SpaCy. NLTK non offre modelli di embeddings però può interfacciarsi con WordNet, permettendo task semantici come la Sentiment Analysis.

TF-IDF vs Embeddings

Nel TF-IDF ogni termine viene rappresentato mediante un valore il quale dipende dalla rarità del termine della collezione e dalla frequenza del termine nel documento. Essendo un modello BOW non tiene conto del contesto della parola, dunque non siamo in grado di ricavare il significato della parola. Questo può causare problemi relativi a polisemia e sinonimia.

I Distributional Semantic Models sono dei modelli di distribuzione semantica dove per ogni parola si cerca di ricavare una rappresentazione in base al contesto, quindi per ogni occorrenza di una parola in un documento, si prende il suo contesto e si cerca di creare una rappresentazione vettoriale (embedding) che possa contenere tutti i possibili significati (ovviamente più è grande la rappresentazione e meglio riesco a rappresentare i diversi significati). L’idea è che più due parole sono simili dal punto di vista semantico, più è probabile che compaiano in contesti linguistici simili. Gli embeddings godono anche di proprietà aritmetiche. Ad esempio, se all’embeddings della parola “re” sottraiamo quello della parola “uomo” si ottiene un embedding molto simile a quello della parola “regina”.

Un esempio di architettura per creare embeddings è Word2Vec, costruito mediante una rete neurale a 2 strati. Ne esistono di 2 tipi:

  1. CBOW -> Dato il contesto tenta di ricavare l’embedding di una parola
  2. SKIP-GRAM -> Data una parola si cerca la rappresentazione embedding che meglio descrive il suo contesto

E’ possibile addestrare il proprio modello basato su word2vec utilizzando ad esempio la libreria Gensim, che offre delle API per scaricare dataset e modelli di word embeddings popolari, oltre che a fornire metodi per creare dizionari di parole o rappresentazioni tf-idf di documenti.